# 闭包
# 闭包的定义：在函数嵌套的前提下，内部函数使用了外部函数的变量，并且外部函数返回了内部函数，我们把这个使用外部函数变量的内部函数称为闭包。
# 闭包的作用：闭包可以保存外部函数内的变量，不会随着外部函数调用完而销毁。
# 注意点：由于闭包引用了外部函数的变量，则外部函数的变量没有及时释放，消耗内存。
# 闭包的形成条件：
# 1. 函数嵌套
# 2. 内部函数使用了外部函数的变量   
# 3. 外部函数返回了内部函数
# 闭包的应用：
# 1. 可以使用闭包来保存外部函数内的变量，不会随着外部函数调用完而销毁。
# 2. 可以使用闭包来实现装饰器。

# 装饰器模板
def decorator(func):   
    def wrapper(*args, **kwargs):
        # 在函数调用前执行的代码
        print("装饰器执行前")
        result = func(*args, **kwargs)  # 调用原函数
        print("装饰器执行后")
        # 在函数调用后执行的代码
        return result
    return wrapper

# 装饰器的应用
@decorator  # 等价于 func = decorator(func)
def func():
    print("Hello, world!")  # 原函数

func()  # 调用装饰后的函数，实际上是调用了 wrapper 函数    # 输出：Hello, world!